"""
配置管理
处理应用程序配置
"""
import os
import secrets
import urllib.parse
from typing import Any, Dict, List, Optional, Union
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import field_validator
from dotenv import load_dotenv
from pathlib import Path


class Settings(BaseSettings):
    """应用程序设置"""
    # 环境设置
    SERVER_HOST: str
    SERVER_PORT: int
    APP_ENV: str
    PROJECT_NAME: str

    # 日志配置
    LOG_LEVEL: str
    LOG_BACKUP_COUNT: int
    
    # 安全配置
    JWT_SECRET_KEY: str = secrets.token_urlsafe(32)
    JWT_ALGORITHM: str = "HS256"
    JWT_ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 7  # 7天
    
    # # 数据库配置
    DB_HOST: str
    DB_USER: str
    DB_PASSWORD: str
    DB_NAME: str
    DB_PORT: str
    
    # 邮件配置
    SMTP_SERVER: str
    SMTP_PORT: int
    FROM_EMAIL: str
    AUTH_CODE: str
    
    @property
    def DATABASE_URI(self) -> str:
        """获取数据库URI（带URL编码的密码）"""
        # 对密码进行URL编码
        encoded_password = urllib.parse.quote_plus(self.DB_PASSWORD)
        # 构建连接字符串
        return f"mysql+pymysql://{self.DB_USER}:{encoded_password}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_NAME}"
    
    # CORS配置
    @property
    def CORS_ORIGINS(self) -> List[str]:
        # """获取CORS允许的源，根据环境动态设置"""
        # if self.IS_PRODUCTION:
        #     return [
        #         "https://www.telltech.cn",            # 生产环境域名
        #         "http://www.telltech.cn",             # 生产环境域名 (HTTP)
        #         "http://106.54.165.214",              # 生产环境IP
        #         "https://106.54.165.214",             # 生产环境IP (HTTPS)
        #     ]
        # else:
        #     # 开发环境允许所有源
        #     return [
        #         "http://localhost",              # React 默认端口
        #         "http://127.0.0.1",              # React 默认端口
        #     ]
        """获取CORS允许的源，允许所有来源访问"""
        return ["*"]
    
    # 根据环境判断是否为生产环境
    @property
    def IS_PRODUCTION(self) -> bool:
        """判断是否为生产环境"""
        return self.APP_ENV.lower() == "production"
    
    # 根据环境判断是否为开发环境
    @property
    def IS_DEVELOPMENT(self) -> bool:
        """判断是否为开发环境"""
        return self.APP_ENV.lower() == "development"
    
    # 加载配置
    model_config = SettingsConfigDict(
        env_file=["backend/.env"],  # 支持多个环境变量文件
        case_sensitive=True,
        extra="ignore"  # 允许额外的环境变量
    )
    

# 全局设置对象
settings = Settings() 